FB: sprava uzivatelov v Delphi

Otázka od: Fedor 'fi0dor' Tirsel

29. 4. 2004 2:23

Zdravim,

mam nasledujuci problem. V aplikacii si spravujem uzivatelov databazy (Firebird
1.5, WinXP, IBX); mam tri rozne skupiny uzivatelov (uzivatel, administrator,
vysetrovatel) -- tieto skupiny maju pridelene pravomoci pomocou zaradenia do
urcitej role (UZIVATEL, ADMINISTRATOR, VYSETROVATEL). Vsetko funguje tak ako
ma,
akurat ked chcem napr. novo-vytvorenemu uzivatelovi priradit rolu UZIVATEL,
poslem na server dotaz tvaru GRANT UZIVATEL TO LOGIN_UZIVATELA. Z nejakeho, mne
neznameho dovodu, sa tento dotaz ale neprevedie resp. sa prevedie, ale nema
ziaden ucinok -- novo-vytvoreny uzivatel nie je vlastnikom role UZIVATEL. Ked
vsak rovnaky dotaz GRANT UZIVATEL TO LOGIN_UZIVATELA prevediem napr. v IB
Expert, tak sa dotaz prevedie spravne a uzivatel je clenom zadanej role.
Podotykam, ze v mojej aplikacii sa prihlasujem uzivatelom, ktory ma plne prava
(WITH ADMIN OPTIONS a pod.) -- tie iste prihlasovacie parametre mam aj v IB
Expert. Neviete v com by mohol byt "zakopany pes" -- preco to z Delphi
nefunguje
a z IB Expert ide?

Kod, ktorym pridavam noveho uzivatela a pridelujem rolu:

try
  with sprava_uzivatelov.ib_users do
   begin
     Active := true;
     SecurityAction := ActionAddUser;

     //prekonvertujem diakritiku
     UserName := slovakToAscii( priezvisko.Text + '_' + meno.Text );
     Password := slovakToAscii( self.heslo.Text );
     FirstName := slovakToAscii( self.meno.Text );
     LastName := slovakToAscii( self.priezvisko.Text );

     //pridam uzivatela
     AddUser;
     Active := false;
   end;
finally
  //opravim diakritiku a pridelim prava novemu uzivatelovi
  sprava_uzivatelov.transaction.CommitRetaining; //potvrdim transakciu
  sprava_uzivatelov.doQuery( sprava_uzivatelov.query_security_db,
'UPDATE users
SET first_name = ''' + self.meno.Text + ''', last_name = ''' +
self.priezvisko.Text + ''' WHERE user_name = ''' + UpperCase(
sprava_uzivatelov.ib_users.UserName ) + '''');

  if role = 'ADMINISTRATOR'
  then admin := ' WITH ADMIN OPTION'
  else admin := '';

  sprava_uzivatelov.doQuery( sprava_uzivatelov.query_security_db, 'GRANT ' +
role + ' TO ' + UpperCase( sprava_uzivatelov.ib_users.UserName ) + admin );
  sprava_uzivatelov.doQuery( sprava_uzivatelov.query_database, 'GRANT ' + role
+
' TO ' + UpperCase( sprava_uzivatelov.ib_users.UserName ) + admin );

  sprava_uzivatelov.transaction.Commit; //potvrdim transakciu
end;

S pozdravom...
--
Fedor 'fi0dor' Tirsel
www.fi0dor.info